#include "BOX.h"
#include <cmath>

using namespace RayTrace;
using namespace std;
CBOX::CBOX(void)
{
}

CBOX::~CBOX(void)
{
}

bool RayTrace::CBOX::IsIntersect( const Ray& ray )
{
	const vector3& dir=ray.direction;
	const vector3& origin=ray.origin;
	
	if (fabs(dir.x)>MMIN){
		if (dir.x>MMIN && origin.x<minx)
		{
			float t=(minx-origin.x)/dir.x;
			float y=origin.y+dir.y*t;
			float z=origin.z+dir.z*t;
			if (y<maxy && y>miny && z<maxz && z>minz)
			{
				return true;
			}
		}
		if (dir.x<-1.0f*MMIN && origin.x>maxx)
		{
			float t=(maxx-origin.x)/dir.x;
			float y=origin.y+dir.y*t;
			float z=origin.z+dir.z*t;
			if (y<maxy && y>miny && z<maxz && z>minz)
			{
				return true;
			}
		}
	}

	if (fabs(dir.z)>MMIN)
	{
		if (dir.z>MMIN && origin.z<minz)
		{
			float t=(minz-origin.z)/dir.z;
			float y=origin.y+dir.y*t;
			float x=origin.x+dir.x*t;
			if (y<maxy && y>miny && x<maxx && x>minx)
			{
				return true;
			}
		}
		if (dir.z<-1.0f*MMIN && origin.z>maxz)
		{
			float t=(maxz-origin.z)/dir.z;
			float y=origin.y+dir.y*t;
			float x=origin.x+dir.x*t;
			if (y<maxy && y>miny && x<maxx && x>minx)
			{
				return true;
			}
		}
	}

	if (fabs(dir.y)>MMIN){
		if (dir.y>MMIN && origin.y<miny)
		{
			float t=(miny-origin.y)/dir.y;
			float x=origin.x+dir.x*t;
			float z=origin.z+dir.z*t;
			if (x<maxx && x>minx && z<maxz && z>minz)
			{
				return true;
			}
		}
		if (dir.y<-1.0f*MMIN && origin.y>maxy)
		{
			float t=(maxy-origin.y)/dir.y;
			float x=origin.x+dir.x*t;
			float z=origin.z+dir.z*t;
			if (x<maxx && x>minx && z<maxz && z>minz)
			{
				return true;
			}
		}
	}

	return false;


}

RayTrace::CBOX::CBOX(float _maxx,
					 float _minx,
					 float _maxy,
					 float _miny,
					 float _maxz,
					 float _minz)
					 :maxx(_maxx),
					 minx(_minx),
					 maxy(_maxy),
					 miny(_miny),
					 maxz(_maxz),
					 minz(_minz)
{

}

